4.02. Функции
Разработчику
Аналитику
Тестировщику
Архитектору
Инженеру
Функции
★ Функция – блок кода, который можно вызывать по имени. Это фундаментальный элемент программирования, который представляет собой выполнение определённой задачи.
Поначалу код был алгоритмическим и линейным:
действие1;
действие2;
действие3;
действие4;
действие5
Но позже, код разрастался:
действие1;
действие2;
действие3;
действие4;
действие5;
действие1;
действие2;
действие3;
действие4;
действие5;
действие1;
действие2;
действие3;
действие4;
действие5
И тогда, в целях избежания однотипных действий, решили упаковать действия в функцию и дать ей имя, чтобы просто её вызывать:
функция Делать() {
действие1;
действие2;
действие3;
действие4;
действие5
}
Делать();
Делать();
Главное преимущество функций заключается в том, что они позволяют избежать повторений в коде. Вместо того, чтобы писать один и тот же код несколько раз, можно вынести его в функцию и вызывать по имени. Это помогает организовать программу, делая её более читаемой и управляемой.
Например, не обязательно каждый раз писать код для суммирования двух чисел (a+b), можно создать функцию, назвать её sum. Такая функция должна будет принимать два аргумента (числа), и будет возвращать их сумму.
И вместо того, чтобы каждый раз приравнивать a=10, a=11, a=15, и писать процедуру, можно вызывать функцию sum(10, 20). Поскольку функция представляет собой шаблон sum(a, b), в самом блоке мы просто пишем a+b, и просто вызываем с передачей аргументов:
sum(a, b)
{
return a+b
}
sum(10, 20)
Здесь a и b - параметры, а sum - функция. Функция может не иметь аргументов, и именно поэтому все функции пишутся как имяФункции() - скобки являются характерной чертой функций.
Важный момент - порой люди называют аргументы параметрами, а параметры - аргументами. Это не то же самое.
Параметр - это переменная, которую мы передаём в функцию.
Аргумент - это значение переменной которое передаём.
То есть, в функции sum(a, b), a и b это параметры, а 10 и 20 (значения a и b соответственно) являются аргументами.
Стадии работы функции:
- определение (функция создаётся с помощью уникального имени, определяются входные данные (аргументы));
- вызов - указание имени функции и передача аргументов (при необходимости);
- результат - функция выполняет свою задачу и возвращает результат, который можно использовать дальше в программе.
Переменные и функции можно комбинировать, к примеру, сделав так, что c = sum(a, b), обозначив, что результат выполнения функции будет являться значением переменной.
То есть, если у функции есть return, то можно записать её в переменную. Например, в Python это выглядит так:
def double(x):
result=x*2
return result
num=double(5)
print(num)
# Результат - 10
Поясняю - здесь:
def- ключевое слово для объявления функции,double- имя функции,(x)- параметр,return- ключевое слово для возвращения значения,result- переменная, выступающая в качестве возвращаемого значения,double(5)- вызов функции с аргументом5,num- переменная, равная значению, возвращаемого функциейdouble(5),print(num)- вызов функцииprintс передачей аргументаnum.
Функция double(x) выполняет умножение параметра x на 2, и когда мы вызвали через double(5), мы передали аргумент 5, который умножился на 2 и записался в переменную result. И именно значение этой переменной мы записали в num и вывели через встроенную функцию языка Python - print(), которая выводит указанное в аргументе значение в консоль.
Функции могут быть встроенными (частью языка программирования) или пользовательскими (созданными программистом). Встроенные функции предоставляют готовые решения для распространённых задач, к примеру, вывод текста на экран или работа с файлами.
Как раз функция print() - встроенная функция языка Python, а double(x) - пользовательская.
Функции могут быть реализованы по-разному в зависимости от их назначения, способа определения и использования. Вот основные виды функций:
- Анонимные функции — это функции без имени. Они часто используются для выполнения небольших операций, которые не требуют отдельного определения.
функция(x, y) -> x * y
Эта анонимная функция принимает два аргумента x и y и возвращает их произведение. Её можно использовать сразу, например, передав в качестве аргумента в другую функцию. Анонимные функции полезны, когда нужно быстро выполнить операцию без создания полноценной функции.
- Лямбда-функции (анонимные функции) — это короткие, одноразовые функции, которые не имеют имени. Они используются для выполнения простых операций, которые не требуют создания полноценной функции. Это частный случай анонимной функции.
лямбда(x, y) -> x + y
Здесь мы создали анонимную функцию, которая принимает два аргумента x и y и возвращает их сумму. Такую функцию можно использовать сразу, например, передав её в качестве аргумента в другую функцию. А слово лямбда указывает, что эта функция именно такого типа. Лямбда-функции удобны, когда нужно выполнить небольшую операцию, которую нет смысла выносить в отдельную функцию.
Все лямбда-функции являются анонимными функциями, но не все анонимные функции обязательно являются лямбда-функциями.
Лямбда — это математическая концепция, которая описывает анонимную функцию. Она была впервые введена в лямбда-исчислении (λ-calculus), которое является основой функционального программирования.
Лямбда-выражение — это реализация лямбда-функции в программировании. Оно представляет собой компактный способ записи анонимной функции.
- Стрелочные функции — это упрощённый синтаксис для записи функций.
sum(a, b) => a + b
Здесь мы определили функцию sum, которая принимает два аргумента a и b и возвращает их сумму. Символ => указывает, что это стрелочная функция. Стрелочные функции делают код короче и читаемее, особенно если функция выполняет простую операцию — это позволяет не создавать блок кода, а писать «тело» функции сразу после =>, в одну строку.
- Функции высшего порядка — это функции, которые могут принимать другие функции в качестве аргументов или возвращать функции как результат.
applyOperation(operation, x, y) -> operation(x, y)
Здесь функция applyOperation принимает три аргумента: функцию operation и два числа x и y. Она вызывает переданную функцию operation с аргументами x и y.
Теперь мы можем использовать эту функцию с разными операциями:
sum(a, b) -> a + b
multiply(a, b) -> a * b
result1 = applyOperation(sum, 5, 3) // Результат: 8
result2 = applyOperation(multiply, 5, 3) // Результат: 15
Здесь мы создали ещё две функции - sum, multiply и обе являются аргументами в applyOperation.
Функции высшего порядка могут сочетать оба свойства - и принимать функции как аргументы, и возвращать функцию как результат.
- Рекурсивные функции — это функции, которые вызывают сами себя. Они полезны для решения задач, которые можно разбить на подзадачи того же типа.
factorial(n) ->
если n == 0
вернуть 1
иначе
вернуть n * factorial(n - 1)
Здесь функция factorial вычисляет факториал числа n. Она вызывает саму себя с уменьшенным значением n, пока не достигнет базового случая (n == 0).
Рекурсивные функции позволяют решать сложные задачи, такие как обход деревьев или вычисление факториала, в компактной форме. Если вы не знаете, что такое факториал, можете не углубляться — это математическая операция.
Теоретически, любая функция может быть рекурсивной, если она вызывает сама себя. Но функция должна иметь условие выхода из рекурсии, чтобы избежать бесконечного цикла. Для, собственно, бесконечной обработки есть специальные средства - циклы. Каждый рекурсивный вызов должен приближать задачу к базовому случаю, иначе стек будет переполнен.
- Встроенные функции — это функции, которые уже реализованы в языке программирования. Они предоставляют готовые решения для распространённых задач.
- Чистые функции — это функции, которые всегда возвращают один и тот же результат при одинаковых входных данных и не имеют побочных эффектов (например, изменения глобальных переменных).
add(a, b) -> a + b
Функция add является чистой, так как она всегда возвращает сумму a и b и не изменяет ничего вне своей области видимости.
Функции, которые ничего не возвращают, не могут быть чистыми (к примеру, функции типа void).
Придумайте имя для функции.
Напишите другую функцию с другим именем.
Это будет функция 2.
Вызовите функцию 1 из функции 2.
Методы
★ Метод – функция, привязанная к объекту.
Это особый тип функций, который связан с конкретным объектом, где объект — это структура данных, которая может хранить информацию и выполнять действия.
Методы позволяют объектам «делать что-то» с их данными. Например, если у нас есть объект строки (текст), метод length может вернуть длину этой строки, а метод toUpper преобразует все символы в верхний регистр.
функция Делать {
действие1;
}
некийОбъект {
метод Делать {
действие1;
}
}
Основное отличие методов от обычных функций заключается в том, что методы всегда работают с конкретным объектом. Они «знают», к какому объекту относятся. и могут использовать его данные для выполнения задач. Но методы являются характерной частью объектно-ориентированного программирования, поэтому о них мы поговорим позже.